package com.seed.application;

import com.seed.core.pojo.Account;
import com.seed.core.pojo.Const;
import com.seed.core.pojo.Subject;
import com.seed.uaa.util.StpKit;
import lombok.extern.slf4j.Slf4j;

/**
 * 暂时名称叫A,后面有更好的再改
 */
@Slf4j
public class A {
//    private static String path;
//    private static AppMode mode;
//    private static final ThreadLocal<String> owners = new ThreadLocal<>();
//    private static final ThreadLocal<String> appNames = new ThreadLocal<>();
//    private static final ThreadLocal<String> microNames = new ThreadLocal<>();

//    private static final ThreadLocal<String> seedNames = new ThreadLocal<>();
//    private static final ThreadLocal<String> actionNames = new ThreadLocal<>();
//    private static final ThreadLocal<String> pathVariables = new ThreadLocal<>();
//    private static final ThreadLocal<RequestMethod> methods = new ThreadLocal<>();

//    private static App app;
//    private static final Map<String, App> apps = new ConcurrentHashMap<>();

//    public static String getPath() {
//        return path;
//    }
//
//    public static void setPath(String path) {
//        A.path = path;
//    }
//
//    public static AppMode getMode() {
//        return mode;
//    }
//
//    public static void setMode(AppMode appMode) {
//        mode = appMode;
//    }
//
//    public static void set(String appName, String owner) {
//        owners.set(owner);
//        appNames.set(appName);
//    }
//
//    /**
//     * 解析uri
//     * @param uri 形如 /micro, /micro/action, /micro/seed/action, /micro/seed/action/pathVariable
//     */
//    public static void setSingle(String uri) {
//        uri = uri.substring(1);
//        int pos = uri.indexOf('/');
//        String microName;
//        if(pos == -1) {
//            microName = uri;
//            uri = "";
//        } else {
//            microName = uri.substring(0, pos);
//            uri = uri.substring(pos);
//        }
//        if(!"~".equals(microName)) microNames.set(microName);
//
//        set(uri);
//    }

    /**
     * 解析uri
     * @param uri 形如 /, /action, /seed/action, /seed/action/pathVariable
     */
//    public static void set(String uri) {
//        if(uri.startsWith("/")) uri = uri.substring(1);
//
//        String[] items = uri.split("/");
//        int len = items.length;
//        if(len == 1) {
//            actionNames.set(uri);
//        } else if(len == 2) {
//            seedNames.set(items[0]);
//            actionNames.set(items[1]);
//        } else {
//            seedNames.set(items[0]);
//            actionNames.set(items[1]);
//            pathVariables.set(items[2]);
//        }
//    }
//
//    public static void setMethod(RequestMethod method) {
//        methods.set(method);
//    }

//    public static String getOwner() {
//        return owners.get();
//    }
//
//    public static String getAppName() {
//        return appNames.get();
//    }
//
//    public static String getMicroName() {
//        return microNames.get();
//    }

//    public static String getSeedName() {
//        return seedNames.get();
//    }
//
//    public static String getActionName() {
//        return actionNames.get();
//    }
//
//    public static String getPathVariable() {
//        return pathVariables.get();
//    }
//
//    public static RequestMethod getMethod() {
//        return methods.get();
//    }

//    public static String getAppKey() {
//        String owner = owners.get();
//        String appName = appNames.get();
//        if(StrUtil.isBlank(appName)) return null;
//
//        return (StrUtil.isBlank(owner) ? "" : owner + '.') + appName;
//    }
//
//    public static App getApp() {
//        String appKey = getAppKey();
//        if(StrUtil.isBlank(appKey)) return app;
//
//        App app = apps.get(appKey);
//        if(app == null) {
//            app = initApp(getAppFile());
//            apps.put(appKey, app);
//        }
//
//        return app;
//    }
//
//    public static void setApp(App app) {
//        A.app = app;
//    }
//
//    public static App getApp(String owner, String appName) {
//        String appKey = StrKit.appKey(owner, appName);
//        return apps.get(appKey);
//    }
//
//    public static void removeApp(String owner, String appName) {
//        String appKey = StrKit.appKey(owner, appName);
//        apps.remove(appKey);
//    }
//
//    public static Micro getMicro() {
//        return getApp().getMicro(microNames.get());
//    }
//
//    public static void switchDataSourceKey() {
//        String dataSourceKey = switch(mode) {
//            case single -> getSingleDataSourceKey();
//            case dev -> getDevDataSourceKey();
//            default -> getTenantname();
//        };
//
//        if(StrUtil.isNotBlank(dataSourceKey)) {
//            log.info("切换到数据源【{}】", dataSourceKey);
//            DataSourceKey.use(dataSourceKey);
//        }
//    }

    /**
     * 单体应用模式下数据源key
     * 主应用服务主库: 空(即默认数据源)
     * 微服务主库: 微服务名，如：micro1、micro2
     * 主应用服务租户库： 租户名，如：tenant
     * 微服务租户库： 租户名_微服务名， 如：tenant_micro1、tenant_micro2
     *
     * @return
     */
//    private static String getSingleDataSourceKey() {
//        String microName = A.getMicroName();
//        String tenantname = A.getTenantname();
//
//        if(StrUtil.isBlank(microName)) return tenantname;
//
//        return StrUtil.isBlank(tenantname) ? microName : tenantname + '_' + microName;
//    }

    /**
     * dataSourceKey: 数据源键
     * 默认：开发系统数据源
     * app：内部主应用数据源
     * tenant_app：租户主应用数据源
     * owner.app：内部主应用数据源(带拥有者)
     * owner.tenant_app：租户主应用数据源(带拥有者)
     * app_micro：内部微服务数据源
     * tenant_app_micro：租户微服务数据源
     * owner.app_micro：内部微服务数据源(带拥有者)
     * owner.tenant_app_micro：租户微服务数据源(带拥有者)
     * @return
     */
//    private static String getDevDataSourceKey() {
//        String appName = A.getAppName();
//        if(StrUtil.isBlank(appName)) return getSingleDataSourceKey();
//
//        String owner = getOwner();
//        String microName = getMicroName();
//        String tenantname = getTenantname();
//        return  (StrUtil.isBlank(owner) ? "" : owner + '.') +
//                (StrUtil.isBlank(tenantname) ? "" : tenantname + '_') +
//                appName +
//                (StrUtil.isBlank(microName) ? "" : '_' + microName);
//    }

//    private static App initApp(File appFile) {
//        App app = new App(AppLoadKit.load(appFile));
//        DevInitializer.init(app);
//
//        return app;
//    }

//    public static File getAppFile() {
//        String owner = owners.get();
//        String appName = appNames.get();
//        return getAppFile(owner, appName);
//    }
//
//    public static File getAppFile(String owner, String appName) {
//        if(StrUtil.isBlank(appName)) throw new RuntimeException("应用名称不能为空");
//
//        if(StrUtil.isBlank(path)) throw new RuntimeException("请配置开发路径【seed.path】");
//
//        String name = (StrUtil.isBlank(owner) ? "" : owner + File.separator) + appName;
//        String fileMainName = path + File.separator + name;
//        File file = new File(fileMainName + ".json");
//        if(file.exists()) return file;
//
//        file = new File(fileMainName + ".yml");
//        if(file.exists()) return file;
//
//        file = new File(fileMainName + ".yaml");
//        if(file.exists()) return file;
//
//        throw new RuntimeException(String.format("应用配置文件【%s】不存在", fileMainName));
//    }
//
//    public static void reloadApp(String owner, String appName) {
//        App newApp = initApp(getAppFile(owner, appName));
//        String appKey = StrKit.appKey(owner, appName);
//        apps.put(appKey, newApp);
//    }

//    public static <T> T useTenantname(String tenantname, Supplier<T> supplier) {
//        App app = getApp();
//        String key = StrKit.dataSourceKey(app.getOwner(), app.getName(), tenantname, getMicroName());
//        log.info("使用数据源【{}】", key);
//        return DataSourceKey.use(key, supplier);
//    }
//
//    public static void useTenantname(String tenantname, Runnable runnable) {
//        App app = getApp();
//        String key = StrKit.dataSourceKey(app.getOwner(), app.getName(), tenantname, getMicroName());
//        log.info("使用数据源【{}】", key);
//        DataSourceKey.use(key, runnable);
//    }

    public static Subject getSubject() {
        if(StpKit.isLogin()) return (Subject) StpKit.getSession().get(Const.SUBJECT);
        return null;
    }

    public static Subject getSwitchTo() {
        if(StpKit.isLogin()) return (Subject) StpKit.getSession().get(Const.SWITCH_TO);
        return null;
    }

    public static Subject getCurrent() {
        Subject switchTo = getSwitchTo();
        return switchTo == null ? getSubject() : switchTo;
    }

    public static Account getAccount() {
        Subject switchTo = getSwitchTo();
        if(switchTo != null) return switchTo.getAccount();

        Subject subject = getSubject();
        if(subject != null) return subject.getAccount();

        return null;
    }

    public static String getTenantname() {
        Account account = getAccount();
        if(account != null) return account.getTenantname();

        return null;
    }
}
